from langchain_community.chat_models import ChatTongyi
from ragas import evaluate
import pandas as pd
from datasets import Dataset #加载数据集
from ragas.metrics import answer_correctness, context_precision  # 用于评价RAG生成答案的准确度
from ragas.metrics import context_recall #用于评价RAG应用检索召回的效果
from langchain_community.embeddings import DashScopeEmbeddings

# 初始化LLM
llm = ChatTongyi(model="qwen-plus", api_key="sk-f97e3654139742a4b01a99631628d36d")

#测试问题
test_data1 = {
    #测试问题
    "question":[
        "张华是哪个部⻔的？",
        "张华是哪个部⻔的？",
        "张华是哪个部⻔的？"
    ],

    #RAG给出的答案
    "answer":[
        '⽆法确定张华所属的部⻔，因为提供的信息中没有提到名为“张华”的⼈员。',
        '张华是⼈事部⻔的',
        '张华是产品运营部的'
    ],

    #正确的答案
    "ground_truth":[
        "张华是产品运营部的成员",
        "张华是产品运营部的成员",
        "张华是产品运营部的成员"
    ]
}

test_data2 = {
    #测试问题
    "question":[
        "张华是哪个部⻔的？",
        "张华是哪个部⻔的？",
        "张华是哪个部⻔的？"
    ],

    #RAG给出的答案
    "answer":[
        '⽆法确定张华所属的部⻔，因为提供的信息中没有提到名为“张华”的⼈员。',
        '张华是⼈事部⻔的',
        '张华是产品运营部的'
    ],

    #正确的答案
    "ground_truth":[
        "张华是产品运营部的成员",
        "张华是产品运营部的成员",
        "张华是产品运营部的成员"
    ],
    "contexts": [
        # 案例1：未检索到相关信息（空上下文）
        [],

        # 案例2：检索到错误的上下文（混淆了部门信息）
        [
            "星辰科技有限公司人力资源部有多位员工，负责公司的招聘、培训等工作。"
            "公司各部门中，人力资源部也被部分员工称为人事部。"
        ],

        # 案例3：检索到正确的上下文（准确匹配员工信息）
        [
            "6. 部门：产品运营部\n"
            "   - 姓名：张华\n"
            "   - 职位：产品经理\n"
            "   - 职务：负责产品需求调研与分析，制定产品路线图，编写需求文档\n"
            "   - 员工编号：CY22001\n"
            "   - 入职日期：2022-03-20"
        ]
    ]
}

# 2. 关键步骤：修改 Pandas 显示设置，显示所有列和完整内容
pd.set_option('display.max_columns', None)  # 显示所有列（取消列数限制）
pd.set_option('display.max_colwidth', None)  # 显示列的完整内容（取消内容截断）
pd.set_option('display.width', None)  # 自适应终端宽度，避免列换行

dataset = Dataset.from_dict(test_data2)
score = evaluate(
    dataset = dataset,
    # metrics = [answer_correctness],
    metrics = [context_recall,context_precision],
    llm = llm,
    # embeddings = DashScopeEmbeddings(model="text-embedding-v3",dashscope_api_key="sk-f97e3654139742a4b01a99631628d36d")
)

print(score.to_pandas())

